﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//
using System.Diagnostics;
using System.Collections;
using System.IO;
using System.Net;

// MobiLib, Copyright Mirosław M. Mączka.  All Rights Reserved. This code released under the terms of the Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

namespace MobiLibrary
{
    //
    public partial class MobiLib
    {
        //==================================================================================================================================
        // blok bajtów z tekstem, zdefiniowany w MOBI_header
        public class MobiFullName:IMobiHeader
        {
            public bool IsDirty { get; internal set; }
            internal MemoryBlock mb;
            public MemoryBlock MB { get { return mb; } }
            //
            public int NewFileLength { get; internal set; }
            //
            //public string Text { get { return Bytes2String(MB.Buffer, 0, MB.Length); } set { String2Bytes(value, MB.Buffer, 0, MB.Length + 1); } }
            //
            public MobiFullName(byte[] b)
            {
                lock (olock)
                {
                    IsDirty = false;
                    mb.Buffer = b;
                    //
                    //
                }
            }
            //
            //
            internal string GetString()
            {
                return Bytes2String(mb.Buffer, 0, mb.Length);
            }
            //
            internal bool SetString(MemoryBlock MetaBuffer, string s)
            {
                // UWAGA: długość stringu BEZ zerowych bajtów, ale one tam muszą być!!!!
                // zerowe bajty po nazwie, nie są podane w długości, trzeba wiedzieć ile ich jest
                //
                IsDirty = true;
                List<byte> newText = new List<byte>(String2ByteArray(s));
                NewFileLength = newText.Count;//faktyczna długość tekstu, bez zerowych bajtów
                //
                //
                int diff = mb.Length - NewFileLength;
                //
                if(0==diff)
                {
                    //Array.Copy(newText.ToArray(), mb.Buffer, newText.Count);
                    Array.Copy(newText.ToArray(), mb.Buffer, NewFileLength);
                }
                else if (diff > 0)
                {
                    // Nowy tekst jest krótszy lub taki sam jak dotychczasowy.
                    mb.Buffer = new byte[newText.Count];
                    //Array.Clear(mb.Buffer, 0, mb.Length);
                    Array.Copy(newText.ToArray(), mb.Buffer, NewFileLength);
                    //mb.Length = realTextLength;
                }
                else
                {
                    // Nowy tekst jest dłuższy. Trzeba: dać nowy MB zachowując Offset, zmienić MOBI_header.FullNameLength. Sprawdzić czy się zmieści w MetaBuffer
                    if ((mb.Offset + newText.Count + 1) > MetaBuffer.Length) return false;// 1 na wszelki wypadek
                    mb.Buffer = new byte[newText.Count];
                    //if (!Expand(MetaBuffer, newText.Count)) return false;
                    Array.Copy(newText.ToArray(), mb.Buffer, newText.Count);
                }
                return true;
            }
            //
            //
            internal void Store(MemoryBlock MetaBuffer)
            {
                lock (olock)
                {
                    Array.Copy(mb.Buffer, 0, MetaBuffer.Buffer, mb.Offset, mb.Length);
                }
            }
            //
            //
            public override string ToString()
            {
                lock (olock)
                {
                    return "MobiFullName:\n" + string.Format("MobiFullName=[{0}]\n", GetString());
                }
            }
            //
            public string Dump()
            {
                lock (olock)
                {
                    return "MobiFullName: MB=" + mb.ToString() + ", " + string.Format("MobiFullName=[{0}]\n", GetString());
                }
            }
            //
            //----------------------------------------------------------------------------------------------------------------------------------
            /*
            internal static int getPaddingLength(int fileNameLength)
            {
                return ((fileNameLength % 4 + 2) > 4) ? (8 - (fileNameLength % 4 + 2))+2 : (4 - (fileNameLength % 4 + 2))+2;
            }
             */
            //----------------------------------------------------------------------------------------------------------------------------------
            //
            private bool Expand(MemoryBlock MetaBuffer, int newSize)
            {
                if (mb.Length >= newSize) return true;
                //
                if ((mb.Offset +newSize+32) > MetaBuffer.Length) return false;
                //
                byte[] bb = new byte[newSize];
                Array.Copy(mb.Buffer, bb, mb.Length);
                mb.Buffer = bb;
                //
                //
                return true;
            }
            //
            //==================================================================================================================================
            //
        }//public class MobiFullName
    }//public partial class MobiLib
}//namespace
